/*
 * test_dwr.c
 *
 *  Created on: 21/05/2013
 *      Author: jose
 */


#include <stdio.h>
#include "../tests.h"


void
test_dwr(){
	Dwr_Adj_List * adj = NULL;
	ipoque_unique_flow_ipv4_and_6_struct_t * key = NULL;
	ipoque_unique_flow_ipv4_and_6_struct_t * key2 = NULL;
	Http_Request * req = NULL;
	Http_Request * req2 = NULL;
	Http_Request * req3 = NULL;
	Http_Request * req4 = NULL;
	Http_Response * rsp = NULL;
	Http_Response * rsp2 = NULL;
	ipoque_int_one_line_struct_t host = { "www.yagua.com", 13 };
	ipoque_int_one_line_struct_t host2 = { "www.oas.org", 11 };
	ipoque_int_one_line_struct_t resource = { "/", 1 };
	ipoque_int_one_line_struct_t resource2 = { "guide.html", 10 };
	ipoque_int_one_line_struct_t method = { "GET", 3 };
	ipoque_int_one_line_struct_t method2 = { "POST", 4 };

	/* Crear la lista de adyacencia */
	adj = dwr_adj_list_create();
	if (!adj)
		return;

	/* Crear keys */
	key = dwr_ipoque_key_create(12345, 1111, 58809, 80);
	key2 = dwr_ipoque_key_create(12345, 1111, 58809, 81);
	if (!key || !key2)
		return;

	/* Agregar un headnode con el key recién creado */
	adj->add_head(adj, key);

	/* Imprimir lista de adyacencia */
	adj->print(adj);

	/* Agregar un headnode con el key recién creado,
	 * debe retornar null y la lista de ady manetenerse
	 * igual */
	adj->add_head(adj, key);

	/* Agregar un headnode con el key2 */
	adj->add_head(adj, key2);

	/* Imprimir lista de adyacencia */
	adj->print(adj);

	/* Crear requests */
	req = dwr_request_create();
	dwr_request_update(req, "host", &host2);
	dwr_request_update(req, "resource", &resource);
	dwr_request_update(req, "method", &method);

	req2 = dwr_request_create();
	dwr_request_update(req2, "host", &host2);
	dwr_request_update(req2, "resource", &resource2);

	req3= dwr_request_create();
	dwr_request_update(req3, "host", &host);
	dwr_request_update(req3, "resource", &resource2);
	dwr_request_update(req3, "method", &method2);

	req4 = dwr_request_create();
	dwr_request_update(req4, "host", &host);
	dwr_request_update(req4, "resource", &resource);
	dwr_request_update(req4, "method", &method2);

	/* Agregar el request al headnode del primer key */
	adj->heads[1].add_request(&adj->heads[1], req);

	/* Agregar el request al headnode del primer key */
	adj->heads[1].add_request(&adj->heads[1], req2);

	/* Agregar el request al headnode del key2 */
	adj->heads[2].add_request(&adj->heads[2], req4);

	/* Agregar el request al headnode del key2 */
	adj->heads[2].add_request(&adj->heads[2], req3);

	/* Imprimir lista de adyacencia */
	adj->print(adj);

}
